package come.bjpowernode.javase.singleton;

/**
 * 如果这样写，运行顺序就成了：
 *
 * 检查变量是否被初始化(不去获得锁)，如果已被初始化则立即返回。
 * 获取锁。
 * 再次检查变量是否已经被初始化，如果还没被初始化就初始化一个对象。
 * 执行双重检查是因为，如果多个线程同时了通过了第一次检查，并且其中一个线程首先通过了第二次检查并实例化了对象，那么剩余通过了第一次检查的线程就不会再去实例化对象。
 * 这样，除了初始化的时候会出现加锁的情况，后续的所有调用都会避免加锁而直接返回，解决了性能消耗的问题。
 */
public class SingletonEntityDCL {
    private static SingletonEntityDCL uniqueSingleton;
    private SingletonEntityDCL(){}
    public static SingletonEntityDCL getInstance(){
        if(null == uniqueSingleton){
            synchronized (SingletonEntityDCL.class){
                if(null == uniqueSingleton){
                    uniqueSingleton = new SingletonEntityDCL();
                }
            }
        }
        return uniqueSingleton;
    }
}
